﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Migrator.Util;
using Migrator.Entities;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.ComponentModel;

namespace Migrator.Packets
{
    /// <summary>
    /// IPv4 Packet
    /// 
    /// Header structure:
    ///  0                   1                   2                   3
    ///  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    /// |Version|  IHL  |Type of Service|          Total Length         |
    /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    /// |         Identification        |Flags|      Fragment Offset    |
    /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    /// |  Time to Live |    Protocol   |         Header Checksum       |
    /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    /// |                       Source Address                          |
    /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    /// |                    Destination Address                        |
    /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    /// |                    Options                    |    Padding    |
    /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    /// 
    /// Who cares...
    /// </summary>
    public class IPPacket
    {
        public IPPacket(Node source, IPAddress destinationIP)
        {
            this.Source = source;
            this.Hops = new List<Node>();
            this.DestinationIP = destinationIP;
            this.TimeToLive = 1000;
        }

        public override string ToString()
        {
            return this.GetType().Name + "[" + this.Source.IPAddress + " -> " + this.DestinationIP + "]";
        }

        public Node Source
        {
            get;
            protected set;
        }

        public virtual IPAddress SourceIP
        {
            get { return this.Source.IPAddress; }
            protected set { }
        }

        public IPAddress DestinationIP
        {
            get;
            protected set;
        }

        [TypeConverter(typeof(ExpandableObjectConverter))]
        public List<Node> Hops
        {
            get;
            protected set;
        }

        [TypeConverter(typeof(ExpandableObjectConverter))] 
        public object Payload
        {
            get;
            set;
        }

        #region Miscellaneous fields

        public int Version
        {
            get { return 4; }
        }

        public int TimeToLive
        {
            get;
            set;
        }

        public int Protocol
        {
            get;
            set;
        }

        #endregion
    }
}
